package br.com.massai.model.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import br.com.massai.view.enums.StatusPlanilhaEnum;
import br.com.massai.view.enums.TipoFolhaEnum;

@Entity
@SequenceGenerator(name = "seqPlanilhaLancamento", sequenceName = "seq_planilha_lancamento", allocationSize = 1)
@NamedQueries({
	@NamedQuery(name = "PlanilhaLancamento.findAll", query = "SELECT p FROM PlanilhaLancamento p"),
	@NamedQuery(name = "PlanilhaLancamento.duplicata", query = "SELECT COUNT(p) FROM PlanilhaLancamento p WHERE p.competencia =:comp AND p.tipoFolha =:tipo AND p.obra =:o")
})
@Table(name = "PLANILHA_LANCAMENTO", schema = "PORTAL")
public class PlanilhaLancamento implements Serializable {

	private static final long serialVersionUID = -5898806428098390788L;

	@Id
	@Column(name = "ID_PLANILHA_LANCAMENTO")
	@GeneratedValue(generator = "seqPlanilhaLancamento", strategy = GenerationType.SEQUENCE)
	private Long id;

	@ManyToOne(optional = false)
	@JoinColumn(referencedColumnName = "ID_OBRA", name = "ID_OBRA")
	private Obra obra;

	@Column(name = "COMPETENCIA", length = 6, columnDefinition = "VARCHAR(6)", nullable = false)
	private String competencia;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_CADASTRO")
	private Date dataCadastro;

	@Enumerated(EnumType.STRING)
	@Column(name = "STATUS", nullable = false)
	private StatusPlanilhaEnum status;

	@Enumerated(EnumType.STRING)
	@Column(name = "TIPO_FOLHA")
	private TipoFolhaEnum tipoFolha;
	
	@OneToMany(fetch=FetchType.LAZY, mappedBy = "planilha")
	@Cascade({CascadeType.REMOVE})
	private List<Lancamento> listaLancamentos;

	@Column(name = "OBSERVACAO", nullable = true, columnDefinition = "VARCHAR2(1000)")
	private String observacao;
	
	@Column(name = "OBSERVACAO_REVISAO", nullable = true, columnDefinition = "VARCHAR2(1000)")
	private String observacaoRevisao;
	
	@Column(name = "FINALIZADA")
	private boolean finalizada;

	@Transient
	private boolean paraAnalise;
	
	public PlanilhaLancamento() {
		this.listaLancamentos = new ArrayList<Lancamento>();
		this.status = StatusPlanilhaEnum.P;
		this.dataCadastro = new Date();
		this.finalizada = false;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Obra getObra() {
		return obra;
	}

	public void setObra(Obra obra) {
		this.obra = obra;
	}

	public String getCompetencia() {
		return competencia;
	}

	public void setCompetencia(String competencia) {
		this.competencia = competencia;
	}

	public StatusPlanilhaEnum getStatus() {
		return status;
	}

	public void setStatus(StatusPlanilhaEnum status) {
		this.status = status;
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public TipoFolhaEnum getTipoFolha() {
		return tipoFolha;
	}

	public void setTipoFolha(TipoFolhaEnum tipoFolha) {
		this.tipoFolha = tipoFolha;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public boolean isFinalizada() {
		return finalizada;
	}

	public void setFinalizada(boolean finalizada) {
		this.finalizada = finalizada;
	}

	public boolean isParaAnalise() {
		return paraAnalise;
	}

	public void setParaAnalise(boolean paraAnalise) {
		this.paraAnalise = paraAnalise;
	}

	public List<Lancamento> getListaLancamentos() {
		return listaLancamentos;
	}

	public void setListaLancamentos(List<Lancamento> listaLancamentos) {
		this.listaLancamentos = listaLancamentos;
	}

	public String getObservacaoRevisao() {
		return observacaoRevisao;
	}

	public void setObservacaoRevisao(String observacaoRevisao) {
		this.observacaoRevisao = observacaoRevisao;
	}

}